package com.example.webviewtest;

import androidx.appcompat.app.AppCompatActivity;

import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private WebView mWebView;
    private Button loadUrlBtn;
    private Button evaluateBtn;
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
        initEvents();
    }

    private void initViews() {
        mWebView=findViewById(R.id.webView);
        mWebView.loadUrl("file:///android_asset/index.html");
        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {//js调用原生的方式二
                Log.d(TAG, "shouldOverrideUrlLoading: ");

                Uri url = request.getUrl();
                if (url!=null){
                    String schemenName = url.getScheme();//约定好的协议名称，这里我约定成了myscheme，经测试，协议名需要完全为小写字母
                    if ("myscheme".equals(schemenName)){
                        String authority = url.getAuthority();//约定好的地址名
                        if ("myAddress".equals(authority)){
                            String userName = url.getQueryParameter("userName");//获取用户名参数
                            String password = url.getQueryParameter("password");//获取密码参数
                            Log.d(TAG, "shouldOverrideUrlLoading: 获取到js传过来的用户名userName为："+userName+"，密码为："+password);
                            Toast.makeText(MainActivity.this, "通过重写shouldOverrideUrlLoading的方式让js调用原生的方法", Toast.LENGTH_SHORT).show();
                        }
                        return true;
                    }
                }
                return super.shouldOverrideUrlLoading(view,request);
            }
        });
        mWebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                return super.onJsConfirm(view, url, message, result);
            }

            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                Log.d(TAG, "onJsPrompt: ");
                Uri uri = Uri.parse(message);
                if (uri!=null){
                    String schemeName = uri.getScheme();//自定义的协议名称
                    if("myscheme".equals(schemeName)){
                        String authority = uri.getAuthority();
                        if ("myAddress".equals(authority)){//自定义的地址名
                            String userName = uri.getQueryParameter("userName");//获取js传过来的参数userName
                            String password = uri.getQueryParameter("password"); //获取js传过来的password
                            Toast.makeText(MainActivity.this, "通过拦截prompt弹框的方式让js调用原生的方法，原生获取到的userName为："+userName+"，password为："+password, Toast.LENGTH_SHORT).show();
                        }
                        result.cancel();//这行要加上，不然onJsPrompt只会被调用一次，而且后续的js方法也会失效
                        return true;//返回true表示拦截弹框，只要符合约定的协议，就将js中的prompt弹框拦截，不让其弹出来
                    }
                }
                return super.onJsPrompt(view,url,message,defaultValue,result);
            }
        });
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存
        loadUrlBtn=findViewById(R.id.loadUrlBtn);
        evaluateBtn=findViewById(R.id.evaluateBtn);
    }

    private void initEvents(){

        //原生调用js的第一种方式：调用WebView的loadUrl()方法，会使得页面重新刷新一次，不方便获取js函数的返回值
        loadUrlBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.loadUrl("javascript:cat()");
            }
        });

        //原生调用js的第二种方式，调用WebView的evaluateJavascript()方法
        evaluateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.evaluateJavascript("javascript:sayHello()", new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String value) {//可以在这个回调方法里面拿到js方法的返回值
                        Log.d(TAG, "onReceiveValue: "+value);
                    }
                });
            }
        });


        MyNative myNative = new MyNative();//不要使用匿名内部类放入addJavascriptInterface中
        //让js调用原生的方法
        mWebView.addJavascriptInterface(myNative,"android");
    }


    class MyNative{
        @JavascriptInterface
        public void getNative1(String who){
            Log.d(TAG, "getNative1: "+who);
            Toast.makeText(MainActivity.this, "js通过对象映射addJavascriptInterface的方式调用了原生的方法", Toast.LENGTH_SHORT).show();
        }
    }
}